-- sqlsuspendido
-- _taskID :taskID
-- _grupo tecnicosSF

CREATE or REPLACE function dprocessCreditos.leer_guia
(param_cre_id char(10), param_sec_id integer)

returns setof record 

AS $$

DECLARE
v_gui_id integer;
v_sec_descripcion_numero varchar(10);
rta RECORD;


begin


select gui_id into v_gui_id from dprocessCreditos.cre_guia where cre_id = $1 ;



if param_sec_id is null THEN 

	select s.sec_descripcion_numero, s.sec_descripcion , s.sec_descripcion_numero
	|| '.' || CAST(p.pre_numero as varchar) as sec_numero_pregunta, p.pre_pregunta, 
	s.gui_id, s.sec_id, p.pre_numero, p.tre_id, t.tre_es_tabla, t.tre_es_choice, 
	(select res_respuesta from dprocessCreditos.gui_respuestas_char
	where sec_id = s.sec_id and v_gui_id=s.gui_id and pre_numero=p.pre_numero and cre_id=$1
	and tab_columna is null and tab_secuencia is null
	order by res_fecha_actualizacion desc limit 1
	) as respuesta_char,
	(select res_respuesta from dprocessCreditos.gui_respuestas_numeric
	where sec_id = s.sec_id and v_gui_id=s.gui_id and pre_numero=p.pre_numero and cre_id=$1
	and tab_columna is null and tab_secuencia is null
	order by res_fecha_actualizacion desc limit 1
	) as respuesta_numeric,
	(select  res_respuesta from dprocessCreditos.gui_respuestas_text
	where sec_id = s.sec_id and v_gui_id=s.gui_id and pre_numero=p.pre_numero and cre_id=$1
	and tab_columna is null and tab_secuencia is null
	order by res_fecha_actualizacion desc limit 1
	) as respuesta_text
	into rta
	from dprocessCreditos.gui_secciones s 
	     left join dprocessCreditos.gui_preguntas p on s.sec_id=p.sec_id  and s.gui_id=p.gui_id
	     left join dprocessCreditos.gui_tipo_respuesta t on p.tre_id=t.tre_id 
	where s.gui_id = v_gui_id
	order by sec_descripcion_numero;

else
	select  sec_descripcion_numero into v_sec_descripcion_numero  from gui_secciones where v_gui_id=gui_id and sec_id=$2;

	select s.sec_descripcion_numero, s.sec_descripcion , s.sec_descripcion_numero
	|| '.' || CAST(p.pre_numero as Varchar) as sec_numero_pregunta, p.pre_pregunta, 
	s.gui_id, s.sec_id, p.pre_numero, p.tre_id, t.tre_es_tabla, t.tre_es_choice, 
	(select  res_respuesta from dbo.gui_respuestas_char
	where sec_id = s.sec_id and v_gui_id=s.gui_id and pre_numero=p.pre_numero and cre_id=$1
	and tab_columna is null and tab_secuencia is null
	order by res_fecha_actualizacion desc limit 1
	) as respuesta_char,
	(select res_respuesta from dbo.gui_respuestas_numeric
	where sec_id = s.sec_id and v_gui_id=s.gui_id and pre_numero=p.pre_numero and cre_id=$1
	and tab_columna is null and tab_secuencia is null
	order by res_fecha_actualizacion desc limit 1
	) as respuesta_numeric,
	(select res_respuesta from dbo.gui_respuestas_text
	where sec_id = s.sec_id and v_gui_id=s.gui_id and pre_numero=p.pre_numero and cre_id=$1
	and tab_columna is null and tab_secuencia is null
	order by res_fecha_actualizacion desc limit 1
	) as respuesta_text
	into rta
	from dprocessCreditos.gui_secciones s 
	   left join dprocessCreditos.gui_preguntas p on s.sec_id=p.sec_id  and s.gui_id=p.gui_id
	   left join dprocessCreditos.gui_tipo_respuesta t on p.tre_id=t.tre_id 
	where s.gui_id = v_gui_id and (s.sec_id=$2 or s.sec_padre=$2 or left(s.sec_descripcion_numero, len(v_sec_descripcion_numero)) = v_sec_descripcion_numero)
	order by sec_descripcion_numero;
END IF;


END;
$$ LANGUAGE plpgsql;



-- sec_descripcion_numero varchar(12), sec_descripcion varchar(255), sec_numero_pregunta varchar(255), 
-- pre_pregunta varchar(1000), gui_id integer, sec_id integer, pre_numero integer, tre_id smallint,
-- tre_es_tabla bit(1), tre_es_choice bit(1), respuesta_char varchar(1024), respuesta_numeric numeric,
-- respuesta_text varchar(6144)


/*
select * from  dprocessCreditos.leer_guia ('1094',null)
as foo(sec_descripcion_numero varchar(12), sec_descripcion varchar(255),
 sec_numero_pregunta varchar(255),
pre_pregunta varchar(1000), gui_id integer, sec_id integer, pre_numero
integer, tre_id smallint,
tre_es_tabla bit(1), tre_es_choice bit(1), respuesta_char varchar(1024)
, respuesta_numeric numeric,
respuesta_text varchar(6144));

*/


----------------------------------------------------------------------------------------


CREATE or REPLACE function dprocessCreditos.leer_tabla
(param_cre_id char(10), 
param_gui_id integer,
param_sec_id integer,
param_pre_numero integer)

returns setof record
AS $$

DECLARE
tabla varchar(50);
sql varchar(1000);
rta RECORD;

begin 

select  tre_tabla_destino from dprocessCreditos.gui_tipo_respuesta where 
tre_id=(select tre_id from dprocessCreditos.gui_preguntas where gui_id=param_gui_id and sec_id=param_sec_id and pre_numero=param_pre_numero)
into tabla;

sql := 'select r.tab_secuencia, t.tab_orden_columna, r.res_respuesta from dprocessCreditos.' || tabla || ' r inner join dprocessCreditos.gui_formato_tablas t on r.gui_id=t.gui_id and r.sec_id=t.sec_id and r.pre_numero=t.pre_numero and t.tab_columna=r.tab_columna where r.cre_id=' || @cre_id || ' and r.gui_id=' || @gui_id || ' and r.sec_id=' || @sec_id || ' and r.pre_numero=' || @pre_numero || ' order by r.tab_secuencia, t.tab_orden_columna, r.res_fecha_actualizacion';

execute sql into rta;

end;
$$ LANGUAGE plpgsql;





---------------------------------------------------------














CREATE or REPLACE function dprocessCreditos.guardar_datos (
	param_cre_id char(10),
	param_gui_id int, 
	param_sec_id int, 
	param_pre_numero int, 
	param_tab_columna tinyint, 
	param_tab_numero_orden tinyint,
	param_valor sql_variant,
	param_usuario varchar(20),
    param_sesion varchar(50) = null
)

returns setof record 

AS $$

DECLARE
 v_tabla_destino varchar(50);
 v_es_tabla bit(1);
 v_es_choice bit(1);

 v_tipo varchar(20);
 v_cadena varchar(8000);
 v_cadena_insert varchar(7144);
 v_cadena_update varchar(7144);
 v_cadena_valor varchar(6144);

 param_sesion_2 uuid;


BEGIN


param_sesion_2 := '681DD158-B7C4-4719-AF64-00A5457F3D60';
param_sesion := '681DD158-B7C4-4719-AF64-00A5457F3D60';

select r.tre_tabla_destino, r.tre_es_tabla,r.tre_es_choice 
  into v_tabla_destino, v_es_tabla, v_es_choice
from dprocessCreditos.gui_preguntas p 
  left join dprocessCreditos.gui_tipo_respuesta r on 
   p.tre_id=r.tre_id
where gui_id=param_gui_id and sec_id=param_sec_id and pre_numero=param_pre_numero;

--busco el tipo de datos a guardar
select t.name 
  into v_tipo
from syscolumns c inner join systypes t on c.xtype = t.xtype 
where c.name='res_respuesta' and id in (select id from sysobjects where 
name = v_tabla_destino)

--Verifico si es tabla o choice (para tomar en cuenta o no las coordenadas)
if v_es_tabla = 0 and v_es_choice=0 
begin
  param_tab_columna := null
  param_tab_numero_orden := null
end



--Cargo el valor. Si es char o no, define que use comillas
if v_tipo like '%char%'
   set v_cadena_valor = '''' || convert(varchar(6144), param_valor) || ''''
else
   set v_cadena_valor = convert(varchar, param_valor)



--Preparo la cadena del insert
set v_cadena_insert = 'insert into ' || v_tabla_destino || ' (cre_id, gui_id, sec_id, pre_numero, tab_columna, tab_secuencia, res_respuesta, res_fecha_actualizacion, res_usuario_actualizacion, res_sesion) ' 
set v_cadena_insert = v_cadena_insert || 'values (''' || param_cre_id || ''', ' || convert(varchar, param_gui_id) || ', ' || convert(varchar, param_sec_id) || ', ' || convert(varchar, param_pre_numero) || ', ' 
if param_tab_columna is null 
   set v_cadena_insert = v_cadena_insert || 'null'
else
   set v_cadena_insert = v_cadena_insert || convert(varchar, param_tab_columna) 
set v_cadena_insert = v_cadena_insert || ', '

if param_tab_numero_orden is null 
   set v_cadena_insert = v_cadena_insert || 'null'
else
   set v_cadena_insert = v_cadena_insert || convert(varchar, param_tab_numero_orden) 
set v_cadena_insert = v_cadena_insert || ', ' || v_cadena_valor
set v_cadena_insert = v_cadena_insert || ', getDate(), ''' || param_usuario || ''', ''' || convert(varchar(50),param_sesion_2) || ''')'

--Preparo la cadena del update
set v_cadena_update = 'update ' || v_tabla_destino || ' set res_respuesta = ' || v_cadena_valor || ', res_usuario_actualizacion=''' || param_usuario || ''', res_fecha_actualizacion=getDate() where '
set v_cadena_update = v_cadena_update || 'cre_id=''' || convert(varchar,param_cre_id) || ''' and '
set v_cadena_update = v_cadena_update || 'gui_id=' || convert(varchar,param_gui_id) || ' and '
set v_cadena_update = v_cadena_update || 'sec_id=' || convert(varchar,param_sec_id) || ' and '
set v_cadena_update = v_cadena_update || 'pre_numero=' || convert(varchar,param_pre_numero) || ' and '
if param_tab_columna is null 
   set v_cadena_update = v_cadena_update || 'tab_columna is null and '
else
   set v_cadena_update = v_cadena_update || 'tab_columna=''' || convert(varchar, param_tab_columna)  || ''' and '
if param_tab_numero_orden is null 
   set v_cadena_update = v_cadena_update || 'tab_secuencia is null '
else
   set v_cadena_update = v_cadena_update || 'tab_secuencia=''' || convert(varchar, param_tab_numero_orden)  || ''''

--Preparo la cadena total
set v_cadena = 'if exists (select * from ' || v_tabla_destino || ' where '
set v_cadena = v_cadena || 'res_sesion=''' || convert(varchar(50),param_sesion) || ''' and '
set v_cadena = v_cadena || 'cre_id=''' || convert(varchar,param_cre_id) || ''' and '
set v_cadena = v_cadena || 'gui_id=' || convert(varchar,param_gui_id) || ' and '
set v_cadena = v_cadena || 'sec_id=' || convert(varchar,param_sec_id) || ' and '
set v_cadena = v_cadena || 'pre_numero=' || convert(varchar,param_pre_numero) || ' and '
if param_tab_columna is null 
   set v_cadena = v_cadena || 'tab_columna is null and '
else
   set v_cadena = v_cadena || 'tab_columna=''' || convert(varchar, param_tab_columna)  || ''' and '
if param_tab_numero_orden is null 
   set v_cadena = v_cadena || 'tab_secuencia is null '
else
   set v_cadena = v_cadena || 'tab_secuencia=''' || convert(varchar, param_tab_numero_orden)  || ''''

set v_cadena = v_cadena || ') begin '
set v_cadena = v_cadena || v_cadena_update || ' end else begin '
set v_cadena = v_cadena || v_cadena_insert || ' end'

--select v_cadena
exec (v_cadena)
select 1 as res

